Skip to content
On this page

总结

以下知识点太密集,可以先了解场景,依靠场景去记忆头字段。后续遇到再加深印象。

1. 前提提要、场景

前面了解了 Header 头信息的基础规则和伪头,而 Header 包含了请求头、响应头。本章按照分类,大致介绍常见的请求头。

2. 控制相关

  • Host场景: traefik 网关管理,一个 IP 挂载多个子域名,通过 Host 区分来源域名,最终分配到不同服务上。

  • Cache-Control:做为请求头字段时,控制客户端的缓存策略。

  • Expect:目前规定只有 Expect: 100-continue。场景:通知服务端,客户端即将发送大小为 Content-Length 的大文件

    • 能满足期望: 100(Continue)
    • 不能满足期望: 417(Expectation Failed)
  • Range:指定范围请求,场景:用于断点续传或音视频传输

    • 范围有效: 206(Partial Content) 响应。且在响应头中有对应的 Content-Range: bytes 4697824-5091876/174754560 (<type> <rangeStart>-<rangeEnd>/<total>)
    • 范围无效: 416(Range Not Satisfiable) 错误。
    • 服务器也可以忽略 Range 并用 200 状态码返回整个资源

3. 条件相关

  • If-Match / If-None-Match / If-Modified-Since: 304(Not Modified,未改变) / 412 (Precondition Failed,前置条件失败) 状态码相关
  • If-Range / Range: 206 (Partial Content,请求成功,部分内容) / 416(Range Not Satisfiable,范围请求无法满足) 状态码相关。

条件请求相关头部

  • If-Match:传递 ETag 值,ETag 值匹配时才返回资源。

    • GET/HEAD 方法: 场景:搭配 Range 字段,可以用来保证【新请求的范围】与【之前请求的范围】是对同一份资源的请求。 不匹配返回 416 (Range Not Satisfiable,范围请求无法满足),意味着服务端在这段期间资源有更新。
    • PUT 方法: 场景:更新资源,避免覆盖掉已更新内容。(跟 git 远程仓库有更新和本地仓库也有更改,避免覆盖而显示冲突很相似) 上传更新资源时,不匹配返回 412 (Precondition Failed,前置条件失败) ,意味着服务端在这段期间资源有更新。
  • If-None-Match:传递 ETag 值,跟 If-Match 相反,ETag 值没有匹配项才返回资源。优先级高于 If-Modified-Since

    • GET/HEAD 方法:场景:用来更新资源最新的 ETag,且决定了客户端是否继续使用已缓存的资源
      • 不匹配,返回资源且返回最新的 ETag(也会尽可能返回 Cache-Control、Content-Location、Date、Expires 和 Vary)。
      • 匹配,返回响应码 304(Not Modified,未改变)
    • PUT(或其它能够引发服务器状态改变的方法):场景:If-None-Match: * 新增资源,避免覆盖资源。(If-Match 目的是更新资源,如果不匹配 ETag 资源则 412,而 If-None-Match: * 目的是新增资源,一但服务器有该资源,无论 Etag 返回 412 匹配,返回 412(Precondition Failed,前置条件失败)
  • If-Modified-Since:传递 Last-Modified。资源在给定时间之后有更新才 200 返回资源。否则 304(Not Modified,未改变)

    • 只能用于 GET/HEAD 方法,场景:用于更新没有 ETag 的资源,因为 If-Modified-Since 优先级低于 If-None-Match
  • If-Range:条件请求,条件满足时 Range 头字段才起作用。

    • 场景:断点续传,用来确保下载的资源没有发生改变。否则重新下载
    • 满足条件:返回 206 (Partial Content,请求成功,部分内容) 并只返回 Range 限定的部分内容;
    • 条件不满足:返回 200 并返回完整的请求资源
      • If-Range: <ETag>:满足 ETag 同个资源时才会返回部分内容
      • If-Range: <Last-Modified>:更改时间未超过限制,才会返回部分内容
    • If-Match 的区别:If-Match 在不匹配时返回 416 (Range Not Satisfiable,范围请求无法满足),而 If-Range 在不匹配时返回新的整个资源。

4. 内容协商

内容类型(Accept)、文件编码(Accept-Encoding)、字符集类型 (Accept-Charset)、语言(Accept-Language) 。
场景:客户端向服务端描述需要怎样的资源

  • 满足: 200
  • 不满足: 406 (Not Acceptable,不可接受) 服务器端无法提供相匹配的资源。(可以通过一些配置不返回 406 如:Accept-Encoding: br;q=1.0, *;q=0)

请求头字段:

  • Accept:客户端可以处理的内容类型,MIME(媒体类型,一种标准)表示。如:application/jsonapplication/javascripttext/htmlimage/png
  • Accept-Encoding:客户端可以处理的压缩编码,如: gzipbr,不配置则可能不压缩。
  • Accept-Charset:客户端可以处理的字符集类型,如:utf-8iso-8859-1
  • Accept-Language:客户端需要的语言,如:en-USzh-CN

5. 认证相关

  • Authorization:每次发送请求时,使用该头部携带 token 信息,维护客户端的认证状态。

6. 来源相关

根据来源字段,场景:统计用户信息,也可以用来防止爬虫和防御 CSRF 攻击

  • Referer:来源页面的完整地址,即该页面是由哪个页面跳转而来的。(由于可能暴露用户的浏览历史,涉及隐私。有途径可以不发送改头信息,在不发送的情况下可以判断 Origin
  • Origin:来源页面的协议、主机、端口(不会像 Referer 一样暴露 path 不会那么敏感),在跨域或同源(非GET 和非 HEAD) 请求中会带上 Origin
  • User-Agent:用户代理,即客户端,比如浏览器版本号之类、命令行工具 curlhttp